/**
 * UtilidadesCapaNegocios.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.negocios;
import java.sql.Date;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import adsec.datos.AdministradorConexion;
import adsec.datos.UtilidadesCapaDatos;
import adsec.entidades.BitacoraEventosUsuario;
import adsec.entidades.LlaveValor;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.Socket;

public class UtilidadesCapaNegocios {

    public final static String IP_VACIA = "0.0.0.0";
    public final static String MAC_VACIA = "00:00:00:00:00:00";
    public final static int QUERY_OK = AdministradorConexion.QUERY_OK;
    public final static int QUERY_ERROR = AdministradorConexion.QUERY_ERROR;
    public final static int QUERY_HALF_OK = AdministradorConexion.QUERY_HALF_OK;
    public final static int moduloEstudiantes = 1;
    public final static int moduloResponsables = 2;
    public final static int moduloMateriasMatriculadas = 3;
    public final static int moduloRegistroNotas = 4;
    public final static int moduloReciboMatricula = 5;
    public final static int moduloDocente = 6;
    public final static int moduloDocenteImparte = 7;
    public final static int moduloNiveles = 8;
    public final static int moduloSecciones = 9;
    public final static int moduloMaterias = 10;
    public final static int moduloConfiguracionCicloLectivo = 11;
    public final static int moduloAsistencia = 12;
    public final static int moduloPersonalAdm = 13;
    public final static int moduloComite = 14;
    public final static int moduloReportes = 15;
    public final static int moduloUsuarios = 16;
    public final static int moduloPerfiles = 17;

    public final static int opInsertar = 0;
    public final static int opModificar = 1;
    public final static int opEliminar = 2;
    public final static int opConsultar = 3;
    public final static int opConsultarTodos = 4;
    //Para los paneles de registro de notas
    public final static int opCerrarActa = 3;
    public final static int opAbrirActa = 4;

    public static final int anioNulo = 1970;
    public static final int mesNulo = 0;
    public static final int diaNulo = 1;

    public final static String CEDULA_INVALIDA = "0-0000-0000";
    private final static String inicioError = "Ha ocurrido un error al ";
    private final static String [][] mensajesError =
    {
        // <editor-fold defaultstate="collapsed" desc="Mensajes de Error">
        //mensajes vacíos
        {" ", " "," "," ", " "},
        //mensajes módulo estudiantes
        {
         inicioError + "insertar el estudiante",
         inicioError + "modificar la información del estudiante",
         inicioError + "eliminar el estudiante",
         inicioError + "consultar la información del estudiante",
         inicioError + "consultar los datos de todos los estudiantes"
        },
        //mensajes módulo responsables
        {
         inicioError + "insertar el responsable",
         inicioError + "modificar la información del responsable",
         inicioError + "eliminar el responsable",
         inicioError + "consultar la información del responsable",
         inicioError + "consultar los datos de todos los responsables"
        },
        //mensajes módulo materias matriculadas
        {
         inicioError + "insertar la(s) materia(s) para matrícula",
         inicioError + "modificar la información de la(s) materia(s) para matrícula",
         inicioError + "eliminar la(s) materia(s) para matrícula",
         inicioError + "consultar la información de la materia para matrícula",
         inicioError + "consultar los datos de todas las materias matriculadas"
        },
        //mensajes módulo registro notas
        {
         inicioError + "insertar el registro de notas",
         inicioError + "modificar el registro de notas",
         inicioError + "eliminar el registro de notas",
         inicioError + "consultar el registro de notas",
         inicioError + "consultar todas las notas"
        },
        //mensajes módulo recibo de matrícula
        {
         inicioError + "insertar la información del recibo matrícula",
         inicioError + "modificar la información del recibo matrícula",
         inicioError + "eliminar la información del recibo matrícula",
         inicioError + "consultar la información del recibo matrícula",
         inicioError + "consultar la información de los recibos de matrícula"
        },
        //mensajes módulo docente
        {
         inicioError + "insertar el docente",
         inicioError + "modificar la información del docente",
         inicioError + "eliminar el docente",
         inicioError + "consultar la información del docente",
         inicioError + "consultar la información de todos los docentes"
        },
        //mensajes módulo docente imparte
        {
         inicioError + "actualizar la(s) materia(s) y seccion(es) que imparte el docente",
         inicioError + "actualizar la(s) materia(s) y seccion(es) que imparte el docente",
         inicioError + "eliminar la(s) materia(s) y seccion(es) que imparte el docente",
         inicioError + "consultar la(s) materia(s) y seccion(es) que imparte el docente",
         inicioError + "consultar todas las materias y secciones que imparten todos los docentes"
        },
        //mensajes módulo niveles
        {
         inicioError + "insertar el nivel",
         inicioError + "modificar el nivel",
         inicioError + "eliminar el nivel",
         inicioError + "consultar la información del nivel",
         inicioError + "consultar la información de todos los niveles"
        },
        //mensajes módulo secciones
        {
         inicioError + "insertar la sección",
         inicioError + "modificar la información de la sección",
         inicioError + "eliminar la sección",
         inicioError + "consultar la información de la sección",
         inicioError + "consultar la información de todas las secciones"
        },
        //mensajes módulo materias
        {
         inicioError + "insertar la materia",
         inicioError + "modificar la información de la materia",
         inicioError + "eliminar la materia",
         inicioError + "consultar la información de la materia",
         inicioError + "consultar la información de todas las materias"
        },
        //mensajes módulo configuración de ciclo lectivo
        {
         inicioError + "insertar la información del ciclo lectivo de la(s) materia(s)",
         inicioError + "modificar la información del ciclo lectivo de la materia",
         inicioError + "eliminar la información del ciclo lectivo de la materia",
         inicioError + "consultar la información del ciclo lectivo de la materia",
         inicioError + "consultar la información de los ciclos lectivos de todas las materias"
        },
        //mensajes módulo asistencia
        {
         inicioError + "insertar los datos de asistencia",
         inicioError + "modificar los datos de asistencia",
         inicioError + "eliminar los datos de asistencia",
         inicioError + "consultar los datos de asistencia",
         inicioError + "consultar todos los datos de asistencia"
        },
        //mensajes módulo personal administrativo
        {
         inicioError + "insertar la información del personal administrativo",
         inicioError + "modificar la información del personal administrativo",
         inicioError + "eliminar la información del personal administrativo",
         inicioError + "consultar la información del personal administrativo",
         inicioError + "consultar la información de todo el personal administrativo"
        },
        //mensajes módulo comité
        {
         inicioError + "insertar los datos del comité",
         inicioError + "modificar los datos del comité",
         inicioError + "eliminar los datos del comité",
         inicioError + "consultar los datos del comité",
         inicioError + "consultar los datos de todos los comités"
        },
        //mensajes módulo reportes
        {
         inicioError + "consultar el reporte 1",
         inicioError + "consultar el reporte 2",
         inicioError + "consultar el reporte 3",
         inicioError + "consultar el reporte 4",
         inicioError + "consultar el reporte 5",
        },
        //mensajes módulo usuarios
        {
         inicioError + "insertar los datos del usuario",
         inicioError + "modificar los datos del usuario",
         inicioError + "eliminar los datos del usuario",
         inicioError + "consultar los datos del usuario",
         inicioError + "consultar los datos de todos los usuarios"
        },
        //mensajes módulo perfiles
        {
         inicioError + "insertar los datos del perfil",
         inicioError + "modificar los datos del perfil",
         inicioError + "eliminar los datos del perfil",
         inicioError + "consultar los datos del perfil",
         inicioError + "consultar los datos de todos los perfiles"
        }
        // </editor-fold>
    };

    private final static String inicioConfirmacion = "¿Está seguro que desea ";
    private final static String [][] mensajesConfimacion =
    {
        // <editor-fold defaultstate="collapsed" desc="Mensajes de Confirmación">
        //mensajes vacíos
        {" ", " "," "," ", " "},
        //mensajes módulo estudiantes
        {
         inicioConfirmacion + "insertar el estudiante?",
         inicioConfirmacion + "modificar la información del estudiante?",
         inicioConfirmacion + "eliminar el estudiante?",
        },
        //mensajes módulo responsables
        {
         inicioConfirmacion + "insertar el responsable?",
         inicioConfirmacion + "modificar la información del responsable?",
         inicioConfirmacion + "eliminar el responsable?",
        },
        //mensajes módulo materias matriculadas
        {
         inicioConfirmacion + "insertar la(s) materia(s) para matrícula?",
         inicioConfirmacion + "modificar la información de la(s) materia(s) para matrícula?",
         inicioConfirmacion+ "eliminar la(s) materia(s) para matrícula?",
        },
        //mensajes módulo registro notas
        {
         inicioConfirmacion + "insertar el registro de notas?",
         inicioConfirmacion + "modificar el registro de notas?",
         inicioConfirmacion + "eliminar el registro de notas?",
         inicioConfirmacion + "cerrar el acta de notas?",
         inicioConfirmacion + "abrir el acta de notas?",
        },
        //mensajes módulo recibo de matrícula
        {
         inicioConfirmacion + "insertar la información del recibo de matrícula?",
         inicioConfirmacion+ "modificar la información del recibo de matrícula?",
         inicioConfirmacion+ "eliminar la información del recibo de matrícula?",
        },
        //mensajes módulo docente
        {
         inicioConfirmacion + "insertar el docente?",
         inicioConfirmacion + "modificar la información del docente?",
         inicioConfirmacion + "eliminar el docente?",
        },
        //mensajes módulo docente imparte
        {
         inicioConfirmacion + "actualizar la(s) materia(s) y seccion(es) que imparte el docente?",
         inicioConfirmacion + "actualizar la(s) materia(s) y seccion(es) que imparte el docente?",
         inicioConfirmacion+ "eliminar la(s) materia(s) y seccion(es) que imparte el docente?",
        },
        //mensajes módulo niveles
        {
         inicioConfirmacion + "insertar el nivel",
         inicioConfirmacion + "modificar el nivel",
         inicioConfirmacion + "eliminar el nivel",
         inicioConfirmacion + "consultar la información del nivel",
         inicioConfirmacion + "consultar la información de todos los niveles"
        },
        //mensajes módulo secciones
        {
         inicioConfirmacion + "insertar la sección?",
         inicioConfirmacion + "modificar la información de la sección?",
         inicioConfirmacion + "eliminar la sección?",
        },
        //mensajes módulo materias
        {
         inicioConfirmacion + "insertar la materia?",
         inicioConfirmacion + "modificar la información de la materia?",
         inicioConfirmacion + "eliminar la materia?",
        },
        //mensajes módulo configuración del ciclo lectivo
        {
         inicioConfirmacion + "insertar la información del ciclo lectivo de la(s) materia(s)?",
         inicioConfirmacion + "modificar la información del ciclo lectivo de la materia?",
         inicioConfirmacion + "eliminar la información del ciclo lectivo de la materia?",
        },
        //mensajes módulo asistencia
        {
         inicioConfirmacion + "insertar los datos de asistencia?",
         inicioConfirmacion + "modificar los datos de asistencia?",
         inicioConfirmacion+ "eliminar los datos de asistencia?",
        },
        //mensajes módulo personal administrativo
        {
         inicioConfirmacion + "insertar la información del personal administrativo?",
         inicioConfirmacion + "modificar la información del personal administrativo?",
         inicioConfirmacion + "eliminar la información del personal administrativo?",
        },
        //mensajes módulo comité
        {
         inicioConfirmacion + "insertar los datos del comité?",
         inicioConfirmacion + "modificar los datos del comité?",
         inicioConfirmacion + "eliminar los datos del comité?",
        },
        //mensajes módulo reportes
        {
         inicioConfirmacion + "consultar el reporte 1",
         inicioConfirmacion + "consultar el reporte 2",
         inicioConfirmacion + "consultar el reporte 3",
         inicioConfirmacion + "consultar el reporte 4",
         inicioConfirmacion + "consultar el reporte 5",
        },
        //mensajes módulo usuarios
        {
         inicioConfirmacion + "insertar los datos del usuario?",
         inicioConfirmacion + "modificar los datos del usuario?",
         inicioConfirmacion + "eliminar los datos del usuario?",
        },
        //mensajes módulo perfiles
        {
         inicioConfirmacion + "insertar los datos del perfil?",
         inicioConfirmacion + "modificar los datos del perfil?",
         inicioConfirmacion + "eliminar los datos del perfil?",
        }
        // </editor-fold>
    };

    private final static String [] nombresModulos = {
        "", "Estudiantes", "Resonsables", "Matricular Materias", "Registro Notas",
        "Docentes", "Docente Imparte", "Niveles", "Secciones", "Materias",
        "Configuración Ciclo Lectivo", "Asistencia", "Personal Administrativo",
        "Comités", "Usuarios", "Perfiles", "Reportes"
    };
    /**
     ** Retorna un String que representa el sexo de manera completa dada una
     ** letra inicial.
     ** @param letra Letra inicial del sexo
     ** @return "Masculino" en caso de letra sea "M", en caso contrario retornará
     ** "Femenino"
     **/
    public static String obtenerSexo(String letra){
        String sexo = "Femenino";
        if(letra.equals("M")){
            sexo = "Masculino";
        }
        return sexo;
    }//fin de método obtener sexo

    /**
     ** Retorna un String que representa un error ocurrido en un módulo al
     ** realizar una operación
     ** @param modulo El código de módulo donde ocurrió el error. Debe ser uno
     ** de los existentes en esta clase.
     ** @param operacion El código de operación que se realizaba cuando ocurrió
     ** el error. Debe ser uno de los existentes en esta clase.
     ** @return Un String que representa un error ocurrido en un módulo al
     ** realizar una operación
     **/
    public static String getErrorOperacion(int modulo, int operacion){
        String error = "Error desconocido";
        if(modulo >= 0 && modulo < mensajesError.length &&
                operacion >= 0 && operacion <= mensajesError[modulo].length){
                error = mensajesError[modulo][operacion];
        }//fin de if
        return error;
    }//fin de getErrorOperacion

    /**
     ** Retorna un String que representa el mensaje de confimación en un módulo al
     ** realizar una operación
     ** @param modulo El código de módulo
     ** @param operacion El código de operación
     ** @return Un String que representa el mensaje de confimación
     **/
    public static String getMensajeConfirmacion(int modulo, int operacion){
        String mensaje = "";
        if(modulo >= 0 && modulo < mensajesConfimacion.length &&
                operacion >= 0 && operacion <= mensajesConfimacion[modulo].length){
                mensaje = mensajesConfimacion[modulo][operacion];
        }//fin de if
        return mensaje;
    }//fin de getMensajeConfimación

     /**
     ** Retorna un entero que representa la edad, realizando el cálculo con la fecha
     ** enviada como párametro
     ** @param fecha
     ** @return edad
     **/
    public static int obtenerEdad(Calendar fecha){
        int edad = 0;
        int anios = Calendar.getInstance().get(Calendar.YEAR) - fecha.get(Calendar.YEAR);
        edad = anios;
        int meses = Calendar.getInstance().get(Calendar.MONTH) - fecha.get(Calendar.MONTH);
        if(meses < 0){
            edad = anios - 1;
        }else{
            if(meses == 0){
                int dias = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) - fecha.get(Calendar.DAY_OF_MONTH);
                if(dias < 0){
                    edad = anios -1;
                }
            }
        }
        return edad;
    }

    /**
     ** Retorna un booleano que indica si en la tabla nombreTabla existe una tupla
     ** con la llave indicada en valorLlave
     ** @param nombreTabla el nombre de la Tabla en la cual buscar
     ** @param nombreLlave el nombre de la llave de la Tabla
     ** @param valorLlave el valor de la llave a consultar
     ** @return true si el existe una tupla cuya llave tiene como valor valorLlave
     **/
    public static boolean existeLlave(String nombreTabla, String nombreLlave, String valorLlave){
        return UtilidadesCapaDatos.existeLlave(nombreTabla, nombreLlave, valorLlave);
    }

    /**
     ** Retorna un booleano que indica si en la tabla nombreTabla existe una tupla
     ** con la llave indicada en valorLlave
     ** @param nombreTabla el nombre de la Tabla en la cual buscar
     ** @param listaLlaveValor la lista con los nombres y valores de las llaves
     ** @return true si el existe una tupla cuya llave tiene como valor valorLlave
     **/
    public static boolean existenLlaves(String nombreTabla, LinkedList<LlaveValor> listaLlaveValor){
        return UtilidadesCapaDatos.existenLlaves(nombreTabla, listaLlaveValor);
    }

    public static boolean esFechaNula(Date fecha){
        boolean resultado = false;
        Calendar calendario = Calendar.getInstance();
        calendario.clear();
        calendario.setTime(fecha);
        resultado = calendario.get(Calendar.YEAR) == anioNulo;
        resultado &= calendario.get(Calendar.MONTH) == mesNulo;
        resultado &= calendario.get(Calendar.DATE) == diaNulo;
        return resultado;
    }

    public static Date getFechaNula(){
        Calendar calendario = Calendar.getInstance();
        calendario.clear();
        calendario.set(anioNulo, mesNulo, diaNulo);
        Date fecha = new Date(calendario.getTimeInMillis());
        return fecha;
    }

    public static String obtenerStringFechaHora(Date fecha){
        DateFormat formatoFecha = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
        return formatoFecha.format(fecha);
    }

    public static String obtenerStringFecha(Date fecha){
        DateFormat formatoFecha = DateFormat.getDateInstance(DateFormat.SHORT);
        return formatoFecha.format(fecha);
    }

    public static String obtenerNombreModulo (int numModulo){
        String resultado = "";
        if( numModulo > 0 && numModulo < nombresModulos.length){
            resultado = nombresModulos[numModulo];
        }
        return resultado;
    }

    public static void llenarCamposRed(BitacoraEventosUsuario registro){
        try{
            //por propósitos de prueba está la IP de mi compu
            //InetAddress address = InetAddress.getByName("192.168.1.102");
            InetAddress address = InetAddress.getByName(AdministradorConexion.getInstancia().getServidor());
            Socket socket = new Socket(address,
                    Integer.valueOf(AdministradorConexion.getInstancia().getPuerto()));
            registro.setIpAddress(socket.getLocalAddress().getHostAddress());
            StringBuffer buffer = new StringBuffer();
            byte [] mac = NetworkInterface.getByInetAddress(socket.getLocalAddress()).getHardwareAddress();
            if(mac != null){
                for(int i = 0; i < mac.length; i++){
                    buffer.append(String.format("%02x", mac[i]));
                    if(i + 1 < mac.length){
                        buffer.append(":");
                    }
                }
            }else{
                buffer.append(MAC_VACIA);
            }
            registro.setMacAddress(buffer.toString());
            //Cuando exista IPv7 hay que cambiar esto :-)
            registro.setTipoIP(address.getAddress().length == 4 ? "IPv4" : "IPv6");
            socket.close();
        }catch (Exception e){
            e.printStackTrace();
            registro.setIpAddress(IP_VACIA);
            registro.setMacAddress(MAC_VACIA);
            registro.setTipoIP("IPv4");
        }
    }

    public static void enviarMensajeBitacoraEU(int seccionModulo, String mensaje){
        ControladoraBitacoraEventosUsuario contBEU = ControladoraBitacoraEventosUsuario.getInstancia();
        BitacoraEventosUsuario registro = new BitacoraEventosUsuario();
        registro.setIdUsuario(AdministradorSeguridad.getInstancia().getUsuario().getIdUsuario());
        llenarCamposRed(registro);
        registro.setSeccionModulo(seccionModulo);
        registro.setMensaje(mensaje);
        contBEU.agregarRegistroBitacora(registro);
    }
}//fin de clase UtilidadesCapaNegocios
